package com.yeung.swordoffer;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 输入n个整数，找出其中最小的K个数。
 * 例如输入4,5,1,6,2,7,3,8这8个数字，则最小的4个数字是1,2,3,4,
 */
public class 最小的K个数 {
    public static void main(String[] args) {
        int[] arr = {4, 5, 1, 6, 2, 7, 3, 8};
        int k = 4;
        ArrayList<Integer> integers = GetLeastNumbers_Solution(arr, k);
        integers.forEach(integer -> System.out.print(integer + " "));
    }

    public static ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
        //利用插入排序的思想, 排序k次之后,就直接返回数组前k个元素就行
        //记录排序次数(应该使用选择排序的时候来记录 已经排序了几次, 这里用了插入排序,需要全排序完,才是正确结果)
        if (input.length < k) return new ArrayList<>();
        int count = 0;
        for (int high = 1; high < input.length; high++) {
            if (input[high - 1] > input[high]) {
                //倒序, 往前插
                //1. 先找到要插入的位置
                int low = high - 1;
                for (; low > 0; low--) {
                    if (input[high] > input[low-1])
                        //zhaodao
                        break;
                }
                //2. 插入元素,后移腾出位置
                int tmp = input[high];
                for (int x = high - 1; x >= low; x--) {
                    input[x + 1] = input[x];
                }
                input[low] = tmp;
            }
//            count++;
//            if (count == k) break;//后边的就不用排了

        }
        int[] kElems = Arrays.copyOfRange(input, 0, k);
        ArrayList<Integer> result = new ArrayList<>();
        for (int kElem : kElems) {
            result.add(kElem);
        }
        return result;
    }
}
